趁著被女兒吵醒睡不著,來趕今天的鐵人文。
本來今天打定想寫的主題是網路圖(Network Graph),但昨天的散佈圖(Scattper Plot)想繼續和地圖(map)結合在一起,不忍心拆散他們,於是今天前半篇先讓她們過著幸福快樂的日子,後半篇再來迎接網路圖。
想像一下,如果我們有許多國家邊界的地理資訊,試著先在圖上利用路徑劃出地圖,x軸是經度(Longitude),y軸是緯度(Latitude),然後把想要去的城市點撒在地圖上分佈,好!我們來複習R語言的maps
套件。
首先我們先載入套件ggplot2
及maps
,並且觀察一下前5筆地圖資料。
#載入maps及ggplot2套件
library(maps)
library(ggplot2)
#載入世界地圖二維地圖(Latitude緯度,Longitude經度)
world_map <- map_data("world")
head(world_map, 5)
每個國家地圖邊界的經緯度資料,大概有個99,338筆邊界資料。
#找出區域
sort(unique(world_map$region))
輸入一下老婆想要旅行的歐洲國家,然後利用指定國家的邊界經緯度劃出幾個國家的地圖。
#旅行國家
mycountry <- c("France", "Austria", "Italy", "Switzerland", "Germany", "Spain", "Czech Republic")
honeymoon <- map_data("world", region = mycountry)
p <- ggplot(honeymoon, aes(x = long, y = lat, group = group, fill = region)) +
geom_polygon(colour = "black") +
scale_fill_brewer(palette = "Set2")
p
決定好國家後,來試算一下老婆想要去的城市,符合以下任一條件:
#載入世界城市的經緯度(二維地圖)
data(world.cities)
mycity <- subset(world.cities, (world.cities$capital == 1 | world.cities$pop > 1000000) & world.cities$country.etc %in% mycountry)
mycity$region <- mycity$country.etc
mycity$group <- 1
mycity
加上旅行城市的點圖,然後人口越多點越大(size=pop)。
p +
geom_point(aes(x = long, y = lat, size = pop), data = mycity, alpha = .7)
加上旅行城市的名稱,位置放在城市點-0.5緯度
p +
geom_point(aes(x = long, y = lat, size = pop), data = mycity, alpha = .7) +
geom_text(aes(x = long, y = lat - 0.5, label = name), data = mycity, colour = "black", fontface = "bold")
回到今天的主題,網路圖(Network Graph)
網路可以表現階層上的關係,通常程式初學時,也很常用遞迴的方式跑出階層,這邊我們會用另外一個R語言套件iGraph
來複習網路圖形呈現。
我們在資料夾MyR新增一支Day21.R
在Day21.R中輸入程式碼
#載入igraph套件
library(igraph)
#新的航線
flightSchedule <- data.frame(
from = c("台北", "台中", "高雄", "台東", "台東"),
to = c("台中", "高雄", "台東", "綠島", "台北"))
#print(flightSchedule)
gd <- graph.data.frame(flightSchedule)
plot(gd, layout = layout.fruchterman.reingold)
另外一種寫法
#偶數個數(兩兩成對)
line <- c("台北", "台中", "台中", "高雄", "高雄", "台東", "台東", "綠島", "台東", "台北")
gd <- graph(line)
plot(gd, layout = layout.fruchterman.reingold)
試試看沒有方向的連接線。
#一般網路圖
gu <- graph(line, directed = FALSE)
plot(gu, layout = layout.fruchterman.reingold)
製作一個簡單的階層關係Dataframe,然後用網路圖呈現
Hierarchy <- data.frame(
name = c("Mike", "Suzie", "James", "Anya", "Jessica", "Benson", "Kyle", "John", "kaven", "Alston", "Ivy", "MT", "Elvis", "Simon"),
Reportto = c("Suzie", "James", "Simon", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "James", "James", "Daniel"))
gd <- graph.data.frame(Hierarchy)
plot(gd, layout = layout.fruchterman.reingold)
來試試gcookbook內建的資料集madmen狂人。
madmen有39筆資料 。
#載入gcookbook
library(gcookbook)
madmen
2個資料行:name1及name2。
畫看看兩個資料行的網路圖
g <- graph.data.frame(madmen, directed = FALSE)
par(mar = c(0, 0, 0, 0)) # Remove unnecessary margins
plot(g, layout = layout.circle, vertex.size = 8, vertex.label = NA)
Day16-21,我們大概花了6天複習了第4個主題:資料視覺化,在當中我們重新認識了幾個R語言常用的圖型及語法使用方式,也許在未來資料分析時,再搭配上重點聚焦及配色,我們也能作出有感染力的數據詮釋。
http://docs.ggplot2.org/current/geom_polygon.html
http://kateto.net/networks-r-igraph
R Graphics cookbook
威尼斯運河
2011.10攝於 Venice,italy